/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 *
 */

package TwitterClient;

import CommonClientLibares.ClientWrapper;
import java.util.List;
import java.util.Vector;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.User;


/**
 *
 * @version 0.0.1.14581
 * @author Sah_hamster
 * Обертка над твитером дабы сохранять все общие настройки для подключения и
 * использования введённых ранее настроик в программе
 */
public class TwitterWrap implements ClientWrapper {

  static String yourProxyAddres = "";
  static int yourProxyPort   = -1;
  static String yourProxyUserName = "";
  static String yourProxyUserPassword = "";

  static String twitterLogin = ""; // field for save Login
  static String twitterPassword = ""; // field for save Password
  static int    isConnected = 0; // 0 no connection; -1 exception ocure; >0 connected;

  public void SetLogin(String iLogin) {
    twitterLogin = iLogin;
  }

  public String GetLogin() {
    return twitterLogin;
  }

  public String GetPassword() {
    return twitterPassword;
  }

  public void SetPassword(String iPassword) {
    twitterPassword = iPassword;
  }

  public Object DoConect(Object aClient)  throws Exception {
    Twitter client = (Twitter) aClient;
    if (this.GetLogin().equals(""))
    {
      throw new Exception("Не указанны параметры для входа");
    } else if (this.GetConnectionStatus() <= 0)
    {
      client = new Twitter(this.GetLogin(), this.GetPassword());
      if (!this.GetProxyAddres().equals("")) {
        client.setHttpProxy(this.GetProxyAddres(), this.GetProxyPort());
        client.setHttpProxyAuth(this.GetProxyUserName(), this.GetProxyUserPassword());
      }
      client.setSource("JSparrow");
      client.setClientURL("http://code.google.com/p/twitterapplication/");
      client.setClientVersion("0.0.1.14561");
      //JOptionPane.showMessageDialog(null, client.getClientURL());
      try {
        isConnected = client.getFriendsStatuses(this.GetLogin()).size();
      } catch (TwitterException ex) {
        isConnected = -1;
      }
    }
    return client;
  }

  /*
   * Возврящаем статус было ли установлено подключение или произошли какие либо
   * ошибки
   */

  public int GetConnectionStatus(){
    return isConnected;
  }

  /*
   * Переписанный метод специально для Twitter поскольку требуется передавать
   * не иницилизированный клас а возвращать иницилизированный. Дополнительно
   * устанавливается состояние соединения, а также проводится проверка на введённые
   * данные логина
   */
  
  // <editor-fold defaultstate="collapsed" desc="Общая группа по получению списка пользователей">
  /*
   * Получаем список в Vector персон которые следят за твитами пользователя если isFollowers истина
   * в противном случае получааем имена тех за кем следит пользователь
   */
  //TODO: возможно предётся ввести сортировку по последнему сообщению посколько следящих может быть >1000 и было бы нераильно просматривать всё
  public Vector GetFollowersPersons(Twitter client, boolean isFollowers) throws TwitterException{
    List<User> us;
    if (isFollowers) {us = client.getFollowersStatuses();}
      else { us = client.getFriendsStatuses(); }
    Vector names = new Vector();
    for (int i = 0; i < us.size(); i++) {
       names.addElement(us.get(i).getName() + " ; " + us.get(i).getId());
    }
    return  names;
  }
  //</editor-fold>

  // переменная для определения как заполнять 2ой столбец в таблици
  private boolean showMix = false;

  private Vector GetNewPersonData(Status uStat){
      Vector OneTwittData = new Vector();
      // получаем ссылку на картинку пользователя
      OneTwittData.addElement(uStat.getUser().getProfileImageURL());
      // получаем время твита или имя твитера
      if (showMix == true) { OneTwittData.addElement(uStat.getUser().getScreenName());
      } else { OneTwittData.addElement(uStat.getCreatedAt());}
      // получаем текст твита
      OneTwittData.addElement(uStat.getText());
      return OneTwittData;
  }
  // <editor-fold defaultstate="collapsed" desc="Общая группа по получению списка сообщений">
  /*
   * Получаем сообщения которые поподают к нам на домащную страницу по умолчанию
   */
  public Vector GetPersonsTimeline(Twitter client) throws TwitterException{
    List<Status> us = client.getFriendsTimeline();
    Vector twittsList = new Vector();
    showMix = true;
    for (int i = 0; i < us.size(); i++) {
        twittsList.add(GetNewPersonData(us.get(i)));
    }
    return twittsList;
  }
  /*
   * Получаем последние 20 сообщений указанной персоны
   */
  public Vector GetPersonsTimeline(Twitter client, String personName) throws TwitterException {
    List<Status> us = client.getUserTimeline(personName);
    Vector twittsList = new Vector();
    showMix = false;
    for (int i = 0; i < us.size(); i++ ) {
      twittsList.add(GetNewPersonData(us.get(i)));
    }
    return twittsList;
  }

  // TODO : Выяснить как получать больше чем 20 сообщений
  public Vector GetMoreTwitts(Twitter client, String personName) throws TwitterException {
    List<Status> us = client.getUserTimeline(personName);
    Vector twittsList = new Vector();
    showMix = false;
    for (int i = 0; i < us.size(); i++ ) {
      twittsList.add(GetNewPersonData(us.get(i)));
    }
    return twittsList;
  }
  //</editor-fold>


  // <editor-fold defaultstate="collapsed" desc="Группа работы с сообщениями отправить удалить">
  public String SendMessage(Twitter client, String personID, String massage, boolean isPrivate) throws TwitterException{
     if (!personID.equals("")) {personID = personID.split("; ")[1];
        User u = client.showUser(personID);
        personID = "@" + u.getScreenName();
        massage = personID + ' ' + massage;
      } else { if (isPrivate) {personID = client.getUserId();}}
    if (!isPrivate) {
    return client.updateStatus(massage).getText();
    } else {return client.sendDirectMessage(personID, massage).getText();}
  }

  public void SetProxyAddres(String proxyAddres) {
    yourProxyAddres = proxyAddres;
  }

  public String GetProxyAddres() {
    return yourProxyAddres;
  }

  public void SetProxyPort(int proxyPort) {
    yourProxyPort = proxyPort;
  }

  public int GetProxyPort() {
    return yourProxyPort;
  }

  public void SetProxyUserName(String proxyUserName) {
    yourProxyUserName = proxyUserName;
  }

  public String GetProxyUserName() {
    return yourProxyUserName;
  }

  public void SetProxyUserPassword(String proxyUserPassword) {
    yourProxyUserPassword = proxyUserPassword;
  }

  public String GetProxyUserPassword() {
    return yourProxyUserPassword;
  }
  // </editor-folder>
}
